Skip to main content

Burn osToken

This example demonstrates how to burn minted osTokens while simultaneously monitoring the health of the osToken position during the process.

import { BrowserProvider, parseEther } from 'ethers'
import { StakeWiseSDK, Network, OsTokenPositionHealth } from '@stakewise/v3-sdk'

const eip1193Provider = window.ethereum

const browserProvider = new BrowserProvider(eip1193Provider, {
chainId: Network.Mainnet,
name: 'mainnet',
})

const sdk = new StakeWiseSDK({
network: Network.Mainnet,
provider: browserProvider,
})

type Input = {
amount: string
userAddress: string
vaultAddress: string
}

const burn = async (values: Input) => {
const { amount, userAddress, vaultAddress } = values

try {
const shares = parseEther(amount)

const [ vault, mint, stake ] = await Promise.all([
sdk.vault.getVault({ vaultAddress }),
sdk.osToken.getBalance({ userAddress, vaultAddress }),
sdk.vault.getStakeBalance({ userAddress, vaultAddress }),
])

if (!mint.shares) {
throw new Error('You have no tokens to burn.')
}

if (shares > mint.shares) {
throw new Error('Insufficient osToken balance')
}

const { health } = sdk.osToken.getHealthFactor({
liqThresholdPercent: BigInt(vault.osTokenConfig.liqThresholdPercent),
mintedAssets: mint.shares - shares,
stakedAssets: stake.assets,
})

if (health !== OsTokenPositionHealth.Healthy) {
throw new Error('Your osToken position will no longer be safe.')
}

const hash = await sdk.osToken.burn({
vaultAddress,
userAddress,
shares,
})

await sdk.provider.waitForTransaction(hash)
}
catch (error) {
console.error(error)
}
}

burn({
amount: '2.21',
userAddress: 'USER_ADDRESS',
vaultAddress: 'VAULT_ADDRESS',
})